/* Es wird ein JPanel erzeugt  das
 * dann in das Dashboard eingebunden wird.
 *  
 * 
 * Datei: MediumAusleihenGUI.java  Autor: Johannes Reinhard
 * Datum: 04.11.2011               Version: 0.2 
 * 
 */
package GUI;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import medienverwaltung.*;
import personenverwaltung.*;

public class MediumAusleihenGUI
{
  /* Haupt JPanel */
  private JPanel hauptJPanel;  
  
  /* Bildschirmgroesse */
  private Dimension bildschirm; 
  /* Objekt Dashboard*/
  private Dashboard sichereDashboard;
  /* Feld mit Infotex */
  private JTextArea informationstext;
  /* Infofeld fuer Barcode */
  private JLabel infoBarco;    
  /* Eingabefeld fuer Barcode */
  private JTextField barcodeEingabe; 
  /* Button zum begin der Ausleihe*/
  private JButton ausleihen;
  /* Buttom zum zurueckgaben es Exemplars */
  private JButton zurueckgeben;	
  /* Buttom zum reservieren eines Exemplars */
  private JButton reservieren;
  
  /* Wiederverwendete Werte */
  private final int b_hoehe;
  private final int b_breite;
  
  private Vorgangsverwaltung vorgang;
  private Mediumverwalter verwalter;
  private Benutzer benutzer;
  private EAN13 ean;
  private Exemplar exemplar; 

  /**
   * Konstruktor der Klasse MediumAusleihenGUI
   * @param bord
   */
  protected MediumAusleihenGUI (Dashboard bord) 
  {
    sichereDashboard = bord;
    bildschirm = sichereDashboard.gibBildschirmgroesse ();
    vorgang = new Vorgangsverwaltung ();
    verwalter = new Mediumverwalter ();
    benutzer = sichereDashboard.persVer.gibBenutzer (Dashboard.nutzerID);
    vorgang.datenLaden ();
    b_hoehe = bildschirm.height / 100;
    b_breite = bildschirm.width / 100;
    erzeugeMediumAusleihenGUI ();
  }
  /**
   * Erzeuge eine Test JPanel das dann eingebunden wird
   */
  private void erzeugeMediumAusleihenGUI ()
  {
    hauptJPanel = new JPanel ();
    informationstext = new JTextArea ();
    infoBarco = new JLabel ();      
    barcodeEingabe = new JTextField ();
    ausleihen = new JButton ();
    zurueckgeben = new JButton ();
    reservieren = new JButton ();
    
    hauptJPanel.setLayout (null);
    /* Ein Begruesungstext wird eingebunden.  */
    informationstext.setText ("\n\n\n\t" + Dashboard.
	sprache.lokal.gibUebersetzung ("Ausleihen"));
    /* Textfeld nicht von Nutzer aenderbar. */
    informationstext.setFocusable (false);
    hauptJPanel.add (informationstext);
    informationstext.setBounds(0, 0, 90 * b_breite, 10 * b_hoehe);
    
    /* Eingabefeld fuer Barcode  */
    infoBarco.setText(Dashboard.
	sprache.lokal.gibUebersetzung ("\n" + "BarcodeEingabefeld"));
    infoBarco.setBounds (10 * b_breite, 30 * b_hoehe, 30 * b_breite, 
	10 * b_hoehe);
    hauptJPanel.add (infoBarco);
    
    /* Eingabefeld fuer den Barcode  */
    barcodeEingabe.setText (Dashboard.
	sprache.lokal.gibUebersetzung ("barcodeEingabe"));
    hauptJPanel.add (barcodeEingabe);
    barcodeEingabe.setBounds (25 * b_breite, 
	34 * b_hoehe, 10 * b_breite, 
	5 * b_hoehe);
    mausInAktionBringen ();
    
    /* Button mit dem der Ausleihvorgang eingeleitet werden kann. */
    ausleihen.setText(Dashboard.
	sprache.lokal.gibUebersetzung ("ausleihen"));
    ausleihen.setBounds (10 * b_breite, 40 * b_hoehe, 
	10 * b_breite, 5 * b_hoehe);
    hauptJPanel.add (ausleihen);
    
    /* Button mit dem der Ausleihvorgang abgebrochen werden kann. */
    zurueckgeben.setText(Dashboard.
	sprache.lokal.gibUebersetzung ("zurueckgeben"));
    zurueckgeben.setBounds (25 * b_breite, 
	40 * b_hoehe, 10 * b_breite, 
	5 * b_hoehe);
    hauptJPanel.add (zurueckgeben);
    
    reservieren.setText(Dashboard.
	sprache.lokal.gibUebersetzung ("medium_reservieren"));
    reservieren.setBounds (40 * b_breite, 
	40 * b_hoehe, 10 * b_breite, 
	5 * b_hoehe);
    hauptJPanel.add (reservieren);
    
    buttonInAktionBringen ();
  }
  
  
  /**
   * Gibt das hauptJPanel zurueck
   * @return JPanel
   */
  protected JPanel getHauptJPanel ()
  {
    return hauptJPanel;
  }
  
  
  /**
   * Buttons werden mit ActionListener versehen und es wird festgelegt
   * was passiert wenn sie betaetigt werden.
   */
  private void buttonInAktionBringen ()
  {
    ausleihen.addActionListener ( 
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e) 
	  {		
	    try
	    {
	      vorgang.datenLaden ();	
     				
	      /* EAN13 ermitteln */
	      long zahl = 0;
	      try
	      {
		/* Parsen und wenn kein Long wert eingegen wird
		 * wird eine Fehlermeldung erzeugt.
		 */
		zahl  = Long.parseLong (barcodeEingabe.getText ()) ;
	      }
	      catch (NumberFormatException ex)
	      {
		fehlerdialog (Dashboard.
		    sprache.lokal.gibUebersetzung ("fehler"),
		    "Falscher Barcode, Incorrect bar code, " +
		    "Code a barres incorrecte");
		barcodeEingabe.setBackground (Color.RED);
	      }
	      
	      /*Exemplar holen damit es ausgeliehen werden kann */
	      ean = new EAN13 (zahl);
	      exemplar = verwalter.gibExemplar (ean);
	      
	      Ausleihe ausleihe 
	      = vorgang.exemplarAusleihen (exemplar, benutzer);
	      
	      if (ausleihe == null)
	      {
		barcodeEingabe.setBackground (Color.RED);
		fehlerdialog (
		    Dashboard.
		    sprache.lokal.gibUebersetzung ("fehlerAusleihe"),
		    
		    Dashboard.
		    sprache.lokal.gibUebersetzung ("fehlerAusleihe"));
      	      }
	      else
	      {
		fehlerdialog ("Ausleihe", 
		    ausleihe.gibPerson ().gibVornamen () + "," +
			ausleihe.gibPerson ().gibNachname () + "\n" + 
			ausleihe.gibExemplar ().gibMedium ().gibTitel ());
		barcodeEingabe.setBackground (Color.GREEN);
		vorgang.datenSpeichern ();
		verwalter.zustandSpeichern ();
	      }
	    }
	    catch (ExemplarNichtAusleihbarAusnahme ex)
	    {
	      barcodeEingabe.setBackground (Color.RED);
	      fehlerdialog (
              
		Dashboard.
		sprache.lokal.gibUebersetzung ("fehlerAusleihe"),
                
                Dashboard.
                sprache.lokal.gibUebersetzung ("fehlerAusleihe"));
	    }
	    catch (EintragNichtGefundenAusnahme ex)
	    {
	      fehlerdialog (Dashboard.
               sprache.lokal.gibUebersetzung ("fehler"),
               "Falscher Barcode, Incorrect bar code, " +
		  "Code a barres incorrecte");
	      barcodeEingabe.setBackground (Color.RED);
          }
	    catch (Exception ex)
	    {
	      barcodeEingabe.setBackground (Color.RED);
	      fehlerdialog (
		  Dashboard.
		  sprache.lokal.gibUebersetzung ("fehlerAusleihe"),
                
		  Dashboard.
		  sprache.lokal.gibUebersetzung ("fehlerAusleihe"));
	    }
    	  }
    	}			
  	);
    zurueckgeben.addActionListener ( 
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e) 
	  {		
	    try
	    {
	      vorgang.datenLaden ();
	      
	      /* EAN13 ermitteln */
	      long zahl = 0;
	      try
	      {
		/* Parsen und wenn kein Long wert eingegen wird
		 * wird eine Fehlermeldung erzeugt.
		 */
		zahl  = Long.parseLong (barcodeEingabe.getText ());
	      }
	      catch (NumberFormatException ex)
	      {
		fehlerdialog (Dashboard.
		    sprache.lokal.gibUebersetzung ("fehler"),
       			"Falscher Barcode, Incorrect bar code, " +
       			"Code a barres incorrecte");
       		  	barcodeEingabe.setBackground (Color.RED);
       	      }
  		  
	      /*Exemplar holen damit es zurueckgegeben werden kann */
	      ean = new EAN13 (zahl);
	      exemplar = verwalter.gibExemplar (ean);
	      
	      Rueckgabe rueck 
	      = vorgang.exemplarZurueckgeben (
		  exemplar, benutzer);
	      if (rueck == null)
	      {
		barcodeEingabe.setBackground (Color.RED);
	      }
	      else
	      {
		fehlerdialog (Dashboard.
		    sprache.lokal.gibUebersetzung ("zurueckgeben"),
		    
  		rueck.gibPerson ().gibVornamen () + "," +
  		rueck.gibPerson ().gibNachname () + "\n" + 
  		rueck.gibExemplar ().gibMedium ().gibTitel ());
		barcodeEingabe.setBackground (Color.GREEN);
		vorgang.datenSpeichern ();
		verwalter.zustandSpeichern ();
	      }
	    }
	    catch (ParameterIstNullAusnahme ex)
	    {
	      barcodeEingabe.setBackground (Color.RED);
	      fehlerdialog (
		  Dashboard.
		  sprache.lokal.gibUebersetzung ("fehlerRueckgabe"),
		  
		  Dashboard.
		  sprache.lokal.gibUebersetzung ("fehlerRueckgabe"));
     	    }
      	    catch (EintragNichtGefundenAusnahme ex)
      	    {
      	      fehlerdialog (Dashboard.
      		  sprache.lokal.gibUebersetzung ("fehler"),
      		  "Falscher Barcode, Incorrect bar code, " +
      		  "Code a barres incorrecte");
      	      barcodeEingabe.setBackground (Color.RED);
      	    }
	  }
	}			
      );
    reservieren.addActionListener ( 
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e) 
	  {   
	    try
	    {
	      vorgang.datenLaden ();
	      
	      /* EAN13 ermitteln */
	      long zahl = 0;
	      try
	      {
		/* Parsen und wenn kein Long wert eingegen wird
		 * wird eine Fehlermeldung erzeugt.
		 */
		zahl  = Long.parseLong (barcodeEingabe.getText ()) ;
	      }
	      catch (NumberFormatException ex)
	      {
		fehlerdialog (Dashboard.
		    sprache.lokal.gibUebersetzung ("fehler"),
		    "Falscher Barcode, Incorrect bar code, " +
		    "Code a barres incorrecte");
                barcodeEingabe.setBackground (Color.RED);
	      }
	      
	      /*Exemplar holen damit es reserviert werden kann */ 
	      ean = new EAN13 (zahl);
	      exemplar = verwalter.gibExemplar (ean);
	      
	      Reservierung reservierung 
	      = vorgang.exemplarVormerken (exemplar, benutzer);
	      
	      if (reservierung == null)
	      {
		barcodeEingabe.setBackground (Color.RED);
		fehlerdialog (
		    
		    Dashboard.
		    sprache.lokal.gibUebersetzung ("fehlerReservierung"),
		    
		    Dashboard.
		    sprache.lokal.gibUebersetzung ("fehlerReservierung"));
                  }
	      else
	      {
		fehlerdialog (Dashboard.
		    sprache.lokal.gibUebersetzung ("medium_reservieren"),
		    
		    reservierung.gibPerson ().gibVornamen () + "," +
		    reservierung.gibPerson ().gibNachname () + "\n" + 
		    reservierung.gibExemplar ().gibMedium ().gibTitel ());
                    
                 barcodeEingabe.setBackground (Color.GREEN);
                 vorgang.datenSpeichern ();
                 verwalter.zustandSpeichern ();
                }
              }
	      catch (EintragNichtGefundenAusnahme ex)
	      {
		fehlerdialog (Dashboard.
		    sprache.lokal.gibUebersetzung ("fehler"),
		    "Falscher Barcode, Incorrect bar code, " +
		    "Code a barres incorrecte");
                barcodeEingabe.setBackground (Color.RED);
              }
	      catch (Exception ex)
	      {
		barcodeEingabe.setBackground (Color.RED);
		fehlerdialog (
		    Dashboard.
		    sprache.lokal.gibUebersetzung ("fehlerReservierung"),
		    
		    Dashboard.
		    sprache.lokal.gibUebersetzung ("fehlerReservierung"));
              }
            }
          }     
  	);
  }
  /**
   * Hier wird ein Listener an ein Textfeld gehaengt. 
   * Wenn man jetzt in das Feld klick 
   * wird der bestehende Inhalt durch einen anderen ersetzt.
   */
  private void mausInAktionBringen ()
  {		
    barcodeEingabe.addMouseListener (
	new MouseListener ()
	{
	  public void mouseClicked (MouseEvent e) 
	  {
	    barcodeEingabe.setText ("");
	    barcodeEingabe.setBackground (Color.WHITE);
  	  }
	  
	  public void mouseEntered (MouseEvent e) 
	  {
	  }
	  
	  public void mouseExited (MouseEvent e) 
	  {	
	  }
	  
	  public void mousePressed (MouseEvent e) 
	  {
	  }
	  
	  public void mouseReleased (MouseEvent e) 
	  {
	  }
	  
  	}
      );
  }
  /**
   * Es wird ein Dialog erzeugt der dem Nutzer sagt was 
   * er getan bzw. was er Falsch gemacht hat.
   * @param fall
   * @param text
   */
  private void fehlerdialog (String fall, String text)
  {
    JOptionPane.showConfirmDialog(null,
	text , fall, 
        JOptionPane.CLOSED_OPTION);
  }
}
